"""
类方法
    概述：
        属于类的方法，必须被@classmethod 装饰器修饰，且形参列表的第一个参数必须是 类对象， 一般用
        cls表示
    调用格式：
        类名.方法名()
        对象名.方法名()   # 可以，但是不推荐


静态方法
    概述：
        类似于 类方法 也是属于类的方法，只不过形参列表没有强制要求，可以按需传入，
        用 @staticmethod 装饰器来修饰

    调用格式：
        类名.方法名()
        对象名.方法名()  # 可以，但是不推荐

类方法和静态方法的区别
    1. 类方法和静态方法的区别就是：在函数内部是否需要使用 类的引用，如果需要，就定义成类方法，否则就定义
      成静态方法，其他没有任何的区别
    2. 静态方法和类方法都是属于类的，类方法和静态方法是先于度下井存在，所以：如果某个函数中不要使用到self对象
        就可以考虑将这个函数定义成静态方法或者类方法
"""

class Student:
    # 类属性
    teacher = '王志刚'

    # 对象属性
    def __init__(self,name,age,gender,address):
        self.name = name
        self.age = age
        self.gender = gender
        self.address = address

    # 对象方法
    def speak(self):
        print(f'我叫{self.name},来自{self.address}')

    # 类方法
    @classmethod
    def method(cls):
        print('我是类方法')
        print(f'访问类属性:{cls.teacher}')
        print(f'cls:{cls}') # <class '__main__.Student'>

    @staticmethod
    def func():
        print('我是静态方法')
        print(f'访问类属性:{Student.teacher}')

if __name__ == '__main__':
    s = Student('刘千琪','20','女','吉林长春')

    # 调用类方法
    # Student.method()
    # s.method() # 语法不报错，但是不推荐

    # 调用静态方法
    # Student.func()
    # s.func() # 语法不报错，但是不推荐